﻿//*******************************************************************************************
// EMPRESA      : Simple Software
// OBJETIVO     : Extender os métodos do Framework
//-------------------------------------------------------------------------------------------
// AUTOR        : Fernando Datorre
// DATA CRIAÇÃO : 28/02/2008
// INSERIDO POR : Paulo Fernando
// Data         : 25/06/2014
//*******************************************************************************************

using System;
using System.Text;

namespace SpaceNeedle.City6473.Web.Data.Models
{
    /// <summary>
    /// Classe que extende os métodos do framework
    /// </summary>
    public static class ExtensionMethods
    {
        /// <summary>
        /// Método que converte um objeto para um valor double
        /// </summary>
        /// <param name="obj">Número em texto a ser convertido</param>
        /// <returns>Retorna o número double convertido</returns>
        public static Double ToDouble(this Object obj)
        {
            try { return Convert.ToDouble(obj); }
            catch { throw new Exception(String.Format("O valor informado não é um valor double válido! Valor informado: '{0}'", obj)); }
        }

        /// <summary>
        /// Método que converte um objeto para número
        /// </summary>
        /// <param name="obj">Objeto a ser convertido</param>
        /// <returns>Retorna o número inteiro convertido</returns>
        public static Int32 ToInt32(this Object obj)
        {
            try { return Convert.ToInt32(obj); }
            catch { throw new Exception(String.Format("O valor informado não é um valor inteiro válido! Valor informado: '{0}'", obj)); }
        }

        /// <summary>
        /// Método que verifica se um texto é nulo. Já usa o Trim
        /// </summary>
        /// <param name="text">Texto a ser verificado</param>
        /// <returns>Retorna se é nulo ou não</returns>
        public static Boolean IsNullOrEmpty(this String text)
        {
            try
            {
                if (text == null)
                    return true;

                return String.IsNullOrEmpty(text.Trim());
            }
            catch { throw new Exception(String.Format("O valor informado não é um valor texto válido! Valor informado: '{0}'", text)); }
        }

        /// <summary>
        /// Método que converte um texto para número
        /// </summary>
        /// <param name="text">Número em texto a ser convertido</param>
        /// <returns>Retorna o número inteiro convertido</returns>
        public static Int32 ToInt32(this String text)
        {
            if(string.IsNullOrEmpty(text))
            {
                return 0;
            }

            try { return Convert.ToInt32(text); }
            catch { throw new Exception(String.Format("O valor informado não é um valor inteiro válido! Valor informado: '{0}'", text)); }
        }

        /// <summary>
        /// Método que converte um valor para inteiro de 64 bits
        /// </summary>
        /// <param name="text">Valor original</param>
        /// <returns>Valor inteiro convertido</returns>
        public static long ToLong(this String text)
        {
            try { return Convert.ToInt64(text); }
            catch { throw new Exception(String.Format("O valor informado não é um valor inteiro válido! Valor informado: '{0}'", text)); }

        }

        /// <summary>
        /// Método que converte um texto para decimal
        /// </summary>
        /// <param name="text">Número em texto a ser convertido</param>
        /// <returns>Retorna o número decimal convertido</returns>
        public static Decimal ToDecimal(this String text)
        {
            try { return Convert.ToDecimal(text); }
            catch { throw new Exception(String.Format("O valor informado não é um valor decimal válido! Valor informado: '{0}'", text)); }
        }

        /// <summary>
        /// Método que converte um objeto para um valor decimal
        /// </summary>
        /// <param name="obj">Objeto a ser convertido</param>
        /// <returns>Retorna o número decimal convertido</returns>
        public static Decimal ToDecimal(this Object obj)
        {
            try { return Convert.ToDecimal(obj); }
            catch { throw new Exception(String.Format("O valor informado não é um valor decimal válido! Valor informado: '{0}'", obj)); }
        }

        /// <summary>
        /// Método que converte um objeto para um valor booleano
        /// </summary>
        /// <param name="obj">Objeto a ser convertido</param>
        /// <returns>Retorna o valor booleano convertido</returns>
        public static Boolean ToBoolean(this Object obj)
        {
            try { return Convert.ToBoolean(obj); }
            catch { throw new Exception(String.Format("O valor informado não é um valor booleano válido! Valor informado: '{0}'", obj)); }
        }

        /// <summary>
        /// Método que converte um texto para Data
        /// </summary>
        /// <param name="text">Número em texto a ser convertido</param>
        /// <returns>Retorna a Data convertida</returns>
        public static DateTime ToDate(this String text)
        {
            try { return Convert.ToDateTime(text); }
            catch { throw new Exception(String.Format("O valor informado não é um valor data válido! Valor informado: '{0}'", text)); }
        }

        /// <summary>
        /// Método que converte um texto para booleano
        /// </summary>
        /// <param name="text">Número em texto a ser convertido</param>
        /// <returns>Retorna o valor Booleano convertido</returns>
        public static Boolean ToBoolean(this String text)
        {
            try { return Convert.ToBoolean(text); }
            catch { throw new Exception(String.Format("O valor informado não é um valor verdadeiro ou falso válido! Valor informado: '{0}'", text)); }
        }

        /// <summary>
        /// Método que converte um número para Boolean
        /// </summary>
        /// <param name="number">Número em texto a ser convertido</param>
        /// <returns>Retorna o valor booleano referente</returns>
        public static Boolean ToBoolean(this Int32 number)
        {
            try { return Convert.ToBoolean(number); }
            catch { throw new Exception(String.Format("O valor informado não é um valor verdadeiro ou falso válido! Valor informado: '{0}'", number)); }
        }

        /// <summary>
        /// Método que converte um texto para Guid
        /// </summary>
        /// <param name="text">Número em texto a ser convertido</param>
        /// <returns>Retorna a Guid convertida</returns>
        public static Guid ToGuid(this String text)
        {
            Guid guid = new Guid();
            try { guid = new Guid(text); }
            catch { guid = Guid.Empty; }
            return guid;
        }

        /// <summary>
        /// Método que converte um texto para Char
        /// </summary>
        /// <param name="text">Número em texto a ser convertido</param>
        /// <returns>Retorna o valor char convertido</returns>
        public static Char ToChar(this String text)
        {
            try { return Convert.ToChar(text); }
            catch { throw new Exception(String.Format("O valor informado não é um valor char válido! Valor informado: '{0}'", text)); }

        }

        /// <summary>
        /// Método que Gera uma quantidade desejada de um mesmo caractere. Usado, por exemplo, para fazer uma linha
        /// </summary>
        /// <param name="character">Caracter desejado</param>
        /// <param name="length">Tamanho desejado</param>
        /// <returns>Retorna o valor após concatenação</returns>
        public static String Fill(this String character, Int32 length)
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < length; i++)
                sb.Append(character);

            return sb.ToString();
        }

        /// <summary>
        /// Metodo que retira de uma string: . - , / _
        /// </summary>
        /// <param name="text">Texto de entrada</param>
        /// <returns>Texto sem caracteres especiais</returns>
        public static String ClearString(this String text)
        {
            string inputString = ".-,/_";
            string outputString = "";
            for (int i = 0; i < inputString.Length; i++)
                text = text.Replace(inputString[i].ToString(), outputString);

            return text;
        }

        /// <summary>
        /// Metodo que retira os careacteres passados de uma string
        /// /// </summary>
        /// <param name="text">Texto de entrada</param>
        /// <param name="inputString">String que deseja que sejam substituidas</param>
        /// <returns>Texto sem caracteres especiais</returns>
        public static String ClearString(this String text, String inputString)
        {
            string outputString = "";
            for (int i = 0; i < inputString.Length; i++)
                text = text.Replace(inputString[i].ToString(), outputString);

            return text;
        }

        /// <summary>
        /// Metodo que retira os acentos
        /// </summary>
        /// <param name="text">Texto com acento</param>
        /// <returns>Texto sem acento</returns>
        public static String RemoveAcent(this String text)
        {
            string inputString = "ÄÅÁÂÀÃäáâàãÉÊËÈéêëèÍÎÏÌíîïìÖÓÔÒÕöóôòõÜÚÛüúûùÇç";
            string outputString = "AAAAAAaaaaaEEEEeeeeIIIIiiiiOOOOOoooooUUUuuuuCc";
            for (int i = 0; i < inputString.Length; i++)
                text = text.Replace(inputString[i].ToString(), outputString[i].ToString());
            return text;
        }

        /// <summary>
        /// Método que formata o nome retirando espaços em branco do meio do nome
        /// </summary>
        /// <param name="text">Texto a ser tratado</param>
        /// <returns>Retorna o nome formatado corretamente</returns>
        public static String FormatName(this String text)
        {
            if (text == null || text == String.Empty)
                return "";

            string[] nameArray = text.Split(' ');
            string nameNew = "";
            foreach (var item in nameArray)
                nameNew += (" " + item).TrimEnd();

            return nameNew.Trim();
        }
    }
}